import * as vscode from 'vscode';
import {dedent} from "../../../utils";

// documentation中使用了代码块，代码块中写的事makedown格式，首行不能为空
let slItems = [
    {
        "label": "Win_Open",
        "insertText": dedent`
        GUI:Win_Open(\${1:filename})
        `,
        "documentation": dedent`# 打开界面
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数     | 必选 | 类型   | 注释                            |
        | :------- | :--- | :----- | :------------------------------ |
        | filename | 是   | string | 界面文件名, 目录默认GUILayout下 |

        `
    },
    {
        "label": "Win_Create",
        "insertText": dedent`
        GUI:Win_Create(\${1:"QSQ_challengeboss"}, \${2:0}, \${3:0}, \${4:0}, \${5:0}, \${6:false}, \${7:false}, \${8:true}, \${9:false})
        `,
        "documentation": dedent`# 创建界面
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数      | 必选 | 类型   | 注释                                                         |
        | :-------- | :--- | :----- | :----------------------------------------------------------- |
        | ID        | 是   | string | 唯一ID                                                       |
        | x         | 是   | int    | 位置 横坐标                                                  |
        | y         | 是   | int    | 位置 纵坐标                                                  |
        | width     | 是   | int    | 宽度                                                         |
        | height    | 是   | int    | 高度                                                         |
        | hideMain  | 否   | bool   | 是否隐藏主界面                                               |
        | hideLast  | 否   | bool   | 是否隐藏上一个界面                                           |
        | needVoice | 否   | bool   | 是否有音效                                                   |
        | escClose  | 否   | bool   | 是否按键盘ESC关闭界面                                        |
        | isRevmsg  | 否   | bool   | 是否pc鼠标经过吞噬/触摸吞噬，默认true                        |
        | npcID     | 否   | int    | 绑定的NPCID                                                  |
        | param     | 否   | int    | 窗口创建层 0主界面层 1普通面板层 2通知层 默认1 [仅普通面板时 hideMain、hideLast、escClose参数生效] |

        注意此方法创建界面只做父节点

        `
    },
    {
        "label": "Win_Close",
        "insertText": dedent`
        GUI:Win_Close(\${1:widget})
        `,
        "documentation": dedent`# 关闭界面
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数     | 必选 | 类型   | 注释                            |
        | :------- | :--- | :----- | :------------------------------ |
        | widget | 是   | obj | 界面对象 |

        `
    },
    {
        "label": "Win_CloseByID",
        "insertText": dedent`
        GUI:Win_CloseByID(\${1:ID})
        `,
        "documentation": dedent`# 关闭界面
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数     | 必选 | 类型   | 注释                            |
        | :------- | :--- | :----- | :------------------------------ |
        | ID | 是   | string | 界面ID |

        通过界面ID关闭界面

        `
    },
    {
        "label": "Win_CloseByNPCID",
        "insertText": dedent`
        GUI:Win_CloseByNPCID(\${1:NPCID})
        `,
        "documentation": dedent`# 关闭界面
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数     | 必选 | 类型   | 注释                            |
        | :------- | :--- | :----- | :------------------------------ |
        | NPCID | 是   | int | NPCID |

        通过NPCID关闭界面

        `
    },
    {
        "label": "Win_SetESCClose",
        "insertText": dedent`
        GUI:Win_SetESCClose(\${1:widget},\${2:value})
        `,
        "documentation": dedent`# 设置是否按ESC键关闭窗口
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数   | 必选 | 类型 | 注释                   |
        | :----- | :--- | :--- | :--------------------- |
        | widget | 是   | obj  | 界面对象               |
        | value  | 是   | bool | 能否关闭, 普通面板生效 |

        通过键盘的Esc键关闭界面

        `
    },
    {
        "label": "Win_CloseAll",
        "insertText": dedent`
        GUI:Win_CloseAll()
        `,
        "documentation": dedent`# 关闭界面
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        关闭所有界面

        `
    },
    {
        "label": "GetWindow",
        "insertText": dedent`
        GUI:GetWindow(\${1:parent},\${2:ID})
        `,
        "documentation": dedent`# 获取界面控件
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数     | 必选 | 类型   | 注释                            |
        | :------- | :--- | :----- | :------------------------------ |
        | parent | 是   | obj | 父节点对象 |
        | ID | 是   | string | 控件ID |

        示例代码

        local _parent = GUI:Win_Create("QSQ_challengeboss", 0, 0, 0, 0, false, false, true, false)
        local LV_type = GUI:ListView_Create(_parent, "LV_type", 905, 65, 40, 450, 1)
        if LV_type then
                local template = GUI:Layout_Create(LV_type, "template", 0, 0, 40, 100)
                if template then
                    GUI:Button_Create(template, "btn_switch", 0,0, "res/01/010022.png")
                end
            end
        end
        方法:一 根据父窗口对象与下级子控件ID获取对象
        local LV_type = GUI:GetWindow(_parent,"LV_type")

        方法:二 根据父窗口对象与多层子控件ID获取对象
        local btn_switch = GUI:GetWindow(_parent,"LV_type/template/btn_switch")

        方法:三 根据当前“桌面”打开的窗口控件ID获取对象
        local _parent = GUI:GetWindow(nil,"QSQ_challengeboss")
        local LV_type = GUI:GetWindow(nil,"QSQ_challengeboss/LV_type")

        `
    },
    {
        "label": "Win_SetParam",
        "insertText": dedent`
        GUI:Win_SetParam(\${1:widget},\${2:param})
        `,
        "documentation": dedent`# 设置控件自定义参数
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数   | 必选 | 类型            | 注释     |
        | :----- | :--- | :-------------- | :------- |
        | widget | 是   | obj             | 界面对象 |
        | param  | 是   | int/string/bool | 参数内容 |

        `
    },
    {
        "label": "Win_GetParam",
        "insertText": dedent`
        GUI:Win_GetParam(\${1:widget})
        `,
        "documentation": dedent`# 获取控件自定义参数
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 界面对象 |

        获取控件自定义参数

        `
    },
    {
        "label": "Win_SetDrag",
        "insertText": dedent`
        GUI:Win_SetDrag(\${1:widget}, \${2:dragLayer})
        `,
        "documentation": dedent`# 设置界面拖拽
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数      | 必选 | 类型 | 注释         |
        | :-------- | :--- | :--- | :----------- |
        | widget    | 是   | obj  | 界面对象     |
        | dragLayer | 是   | obj  | 拖拽区域控件 |

        `
    },
    {
        "label": "Win_SetMainHide",
        "insertText": dedent`
        GUI:Win_SetMainHide(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置主界面隐藏
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数   | 必选 | 类型 | 注释                   |
        | :----- | :--- | :--- | :--------------------- |
        | widget | 是   | obj  | 界面对象               |
        | value  | 是   | bool | 是否隐藏, 普通面板生效 |

        `
    },
    {
        "label": "Win_BindNPC",
        "insertText": dedent`
        GUI:Win_BindNPC(\${1:widget}, \${2:npcID})
        `,
        "documentation": dedent`# 设置界面绑定NPC
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 界面对象 |
        | npcID  | 是   | int  | NPCID    |

        `
    },
    {
        "label": "Win_SetZPanel",
        "insertText": dedent`
        GUI:Win_SetZPanel(\${1:widget}, \${2:zPanel})
        `,
        "documentation": dedent`# 设置界面浮起
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 界面对象 |
        | zPanel | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "Win_BindLuaEvent",
        "insertText": dedent`
        GUI:Win_BindLuaEvent(\${1:widget}, \${2:eventID}, \${3:eventTag})
        `,
        "documentation": dedent`# 设置界面绑定事件
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数     | 必选 | 类型 | 注释     |
        | :------- | :--- | :--- | :------- |
        | widget   | 是   | obj  | 界面对象 |
        | eventID  | 否   | obj  | 事件ID   |
        | eventTag | 否   | obj  | 事件描述 |

        `
    },
    {
        "label": "Win_SetSwallowRightMouseTouch",
        "insertText": dedent`
        GUI:Win_SetSwallowRightMouseTouch(\${1:widget}, \${2:state})
        `,
        "documentation": dedent`# 设置界面内鼠标右键吞噬
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 界面对象 |
        | state  | 是   | bool | 是否吞噬 |

        `
    },
    {
        "label": "Win_IsNull",
        "insertText": dedent`
        GUI:Win_IsNull(\${1:widget})
        `,
        "documentation": dedent`# 判断对象是否为空
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数   | 必选 | 类型 | 注释 |
        | :----- | :--- | :--- | :--- |
        | widget | 是   | obj  | 对象 |

        `
    },
    {
        "label": "Win_IsNotNull",
        "insertText": dedent`
        GUI:Win_IsNotNull(\${1:widget})
        `,
        "documentation": dedent`# 判断对象是否不为空
        [在线文档](http://engine-doc.996m2.com/web/#/22/2161)

        | 参数   | 必选 | 类型 | 注释 |
        | :----- | :--- | :--- | :--- |
        | widget | 是   | obj  | 对象 |

        `
    }
]



export function getCompletionItems(): vscode.CompletionItem[] {


    const completionItems: vscode.CompletionItem[] = [];
    slItems.forEach((item: any) => {
        completionItems.push(createFunctionCompletionItem(item.label, item.insertText, item.documentation));
    });
    return completionItems;
}

function createFunctionCompletionItem(label: string, insertText: string, documentation?: string): vscode.CompletionItem {
    const item = new vscode.CompletionItem(label, vscode.CompletionItemKind.Function);
    item.insertText = new vscode.SnippetString(insertText);
    if (documentation) {
        item.documentation = new vscode.MarkdownString(documentation);
    }
    return item;
}
